<?php

/**
 * 远程发布
 *
 * @version        $Id: makeremote_all.php 1 11:17 2010年7月19日Z tianya $
 * @package        DedeBIZ.Administrator
 * @copyright      Copyright (c) 2020, DedeBIZ.COM
 * @license        https://www.dedebiz.com/license
 * @link           https://www.dedebiz.com
 */
require_once(dirname(__FILE__) . "/config.php");
CheckPurview('sys_MakeHtml');
require_once(DEDEINC . "/arc.partview.class.php");

if ($cfg_remote_site == 'N') exit('Error:$cfg_remote_site is OFF,Check it!');

//生成必须同步服务器的列表
if (file_exists(DEDEDATA . '/config.file.inc.php')) {
    require_once(DEDEDATA . '/config.file.inc.php');
}

if (empty($dopost)) $dopost = '';

$step = !isset($step) ? 1 : $step;
$sta = !isset($sta) ? 0 : $sta;
$totalnum = !isset($totalnum) ? 0 : $totalnum;
$maketype = empty($maketype) ? '' : $maketype;

//获取同步状态
function GetState($val)
{
    $color = ($val == 0) ? 'red' : 'green';
    $signer = ($val == 0) ? '未同步' : '已同步';
    return '<font color="' . $color . '">' . $signer . '</font>';
}

//生成远程目录数组
function addDir($filedir = '', $description = '', $dfserv = 0, $state = 0, $issystem = 0)
{
    return array(
        'filedir' => $filedir,
        'description' => $description,
        'dfserv' => $dfserv,
        'state' => $state,
        'issystem' => $issystem
    );
}

//将配置数组生成配置内容
function makeConfig($dirarray = array())
{
    $config_str = '';
    foreach ($dirarray as $k => $val) {
        $config_str .= '$remotefile[' . $k . '] = array(' . "\n";
        $config_str .= '  \'filedir\'=>\'' . $val['filedir'] . "',\n";
        $config_str .= '  \'description\'=>\'' . $val['description'] . "',\n";
        $config_str .= '  \'dfserv\'=>' . $val['dfserv'] . ",\n";
        $config_str .= '  \'state\'=>' . $val['state'] . ",\n";
        $config_str .= '  \'issystem\'=>' . $val['issystem'] . "\n";
        $config_str .= ");\n";
    }
    return ($config_str == '') ? '' : $config_str;
}

//递归获取目录 by:tianya
function getDirs($directory, $exempt = array('.', '..', '.ds_store', '.svn'), &$files = array())
{
    //没有则创建
    if (is_dir($directory) && !opendir($directory)) mkdir($directory, 0777, TRUE);
    $handle = opendir($directory);

    while (false !== ($resource = readdir($handle))) {
        if (!in_array(strtolower($resource), $exempt)) {
            //排除目录
            if (is_dir($directory . $resource . '/')) {
                array_merge(
                    $files,
                    getDirs($directory . $resource . '/', $exempt, $files)
                );
            } else {
                //if(!is_file($directory.'/'.$resource))
                //{
                $files[] = $directory . '/' . $resource;
                //}
            }
        }
    }
    closedir($handle);
    return $files;
}

function updateConfig($dirarray = array())
{
    //将其转换为配置写入文件
    $configfile = DEDEDATA . '/config.file.inc.php';
    $old_config = @file_get_contents($configfile);
    $config_str = makeConfig($dirarray);
    //替换配置项
    $new_config = preg_replace("/#<s_config>(.*)#<e_config>/s", "#<s_config>\n\n{$config_str}#<e_config>", $old_config);
    file_put_contents($configfile, $new_config);
}

if ($dopost == '') {
}
/*
function Updateremote()
*/ else if ($dopost == 'updateremote') {
    $dirbox = array(); // 定义一个目录容器,确保目录的唯一性
    //获取所有HTML生成文件夹列表
    $query = "SELECT id,typedir,ispart FROM #@__arctype WHERE ispart <> '3'";
    $dsql->SetQuery($query);
    $dsql->Execute('al');
    $dirarray = array();

    $i = 0;
    while ($row = $dsql->GetArray("al")) {
        $darray = explode('/', preg_replace('/{cmspath}/', '', $row['typedir']));
        //仅获取顶级目录作为文件同步更新目录
        if (!in_array($darray[1], $dirbox)) {
            $dirarray[$i] = addDir('/' . $darray[1], '文档HTML默认保存路', 0, 0, 1);
            $dirbox[] = $darray[1];
            $i++;
        }
    }
    //系统附件存放目录
    $dirarray[$i++] = addDir($cfg_medias_dir, '图片/上传文件默认路径', 0, 0, 1);
    //专题目录
    $dirarray[$i++] = addDir('/special', '专题目录', 0, 0, 1);
    //data/js目录
    $dirarray[$i++] = addDir('/data/js', '生成js目录', 0, 0, 1);
    //$remotefile = array();
    //把非系统目录的内容提取出来
    foreach ($remotefile as $key => $value) {
        //处理用户自定义配置
        if ($value['issystem'] == 0) {
            $dirarray[$i++] = addDir(
                $value['filedir'],
                $value['description'],
                $value['dfserv'],
                $value['state'],
                $value['issystem']
            );
        }
    }

    updateConfig($dirarray);

    ShowMsg("成功更新同步目录,请重新对目录进行同步操作!", "makeremote_all.php");
    exit;
}
/*
function Make()&MakeAll()
*/ else if ($dopost == 'make') {
    if ($step == 1) {
        if ($maketype == 'makeall') {
            //如果更新所有,则需要重新组合$Iterm
            foreach ($remotefile as $key => $val) {
                $Iterm[] = $val['filedir'];
            }
        } else {
            //初始化配置
            $Iterm = !isset($Iterm) ? array() : $Iterm;
        }

        $serviterm = !isset($serviterm) ? array() : $serviterm;
        $cacheMakeFile = DEDEDATA . '/cache/filelist.inc.php';
        $dirlist = $alllist = $updir = array();
        $dirindex = 0; //目录统一索引

        //采用比较人性化的更新方式进行提示更新
        //初始化本地文件夹底层的子集目录

        if (count($Iterm) > 0) {
            //获取远程文件(夹)列表
            foreach ($Iterm as $key => $val) {
                $config = $serviterm[$key];
                if (is_array($dirlist = getDirs(DEDEROOT . $val))) {
                    foreach ($dirlist as $k => $v) {
                        $alllist[] = $v . '|' . $config;
                        if (!in_array($val, array_values($updir))) $updir[] = $val;
                    }
                }
            }
            //遍历文件夹列表,如果存在子集文件夹大于3的则需要进行细分
            //将列表写入缓存
            $cachestr = "<?php \n  global \$dirlist,\$upremote;\n  \$dirlist=array();\n";
            foreach ($alllist as $key => $val) {
                list($filename, $fileconfig) = explode('|', $val);
                if (is_dir($filename)) {
                    $deepDir = getDirs($filename);
                    $dd = 0;
                    //先遍历一遍确定子集文件夹数目
                    foreach ($deepDir as $k => $v) {
                        if (is_dir($v)) $dd++;
                    }
                    if ($dd > 3) {
                        //如果自己文件夹数目大于3则
                        foreach ($deepDir as $k => $v) {
                            $v .= '|' . $fileconfig;
                            $cachestr .= "  \$dirlist['$dirindex']='$v';\n";
                            $dirindex++;
                        }
                    } else {
                        $cachestr .= "  \$dirlist['$dirindex']='$val';\n";
                        $dirindex++;
                    }
                }
            }

            foreach ($updir as $key => $val) {
                $cachestr .= "  \$upremote['$key']='$val';\n";
            }
            $cachestr .= "?>";
            file_put_contents($cacheMakeFile, $cachestr);
            $tnum = count($alllist);
            ShowMsg("成功获取远程列表,下面进行文件远程发布!", "makeremote_all.php?dopost=make&step=2&sta=1&totalnum=$tnum");
            exit;
        } else {
            echo '您没有选择,请先选择再点击更新!';
        }
        exit;
    } elseif ($step == 2) {
        if (file_exists(DEDEDATA . '/cache/filelist.inc.php')) {
            require_once(DEDEDATA . '/cache/filelist.inc.php');
        }
        if (is_array($dirlist)) {
            if ($sta > 0 && $sta < $totalnum) {
                list($dirname, $ftpconfig) = explode('|', $dirlist[$sta - 1]);
                list($servurl, $servuser, $servpwd) = explode(',', $ftpconfig);
                $config = array(
                    'hostname' => $servurl, 'username' => $servuser,
                    'password' => $servpwd, 'debug' => 'TRUE'
                );
                if ($ftp->connect($config)) {
                    //var_dump(is_dir($dirname));exit;
                    if (is_dir($dirname)) {
                        //如果是文件目录
                        $remotedir = str_replace(DEDEROOT, '', $dirname) . '/';
                        $localdir = '..' . $remotedir . '/';
                        $ftp->rmkdir($remotedir);
                        if ($ftp->mirror($localdir, $remotedir)) {
                            $sta++;
                            ShowMsg("成功同步文件夹$remotedir,进入下一个任务", "makeremote_all.php?dopost=make&step=2&sta={$sta}&totalnum=$totalnum");
                            exit;
                        }
                    } else {
                        $remotefile = str_replace(DEDEROOT, '', $dirname);
                        $localfile = '..' . $remotefile;
                        //创建远程文件夹
                        $remotedir = preg_replace('/[^\/]*\.(\w){0,}/', '', $remotefile);

                        //如果是文件则需要智能处理
                        $remotebox = array();
                        $ftp->rmkdir($remotedir);
                        foreach ($dirlist as $key => $val) {
                            list($filename, $fileconfig) = explode('|', $val);
                            if (preg_replace('/[^\/]*\.(\w){0,}/', '', str_replace(DEDEROOT, '', $filename)) == $remotedir) {
                                //如果这些文件都在同一目录,则统计这些记录的id项目
                                $remotebox[] = $key;
                            }
                        }
                        //print_r($remotebox);
                        //if(count($remotebox) > 1 && count($remotebox) < 20)
                        if (count($remotebox) > 1) {
                            //如果大于1,则说明有多条记录在同一文件夹内
                            $localdir = '..' . $remotedir;
                            if ($ftp->mirror($localdir, $remotedir)) {
                                $sta = end($remotebox) + 1;
                                ShowMsg("成功同步文件夹$remotedir,进入下一个任务", "makeremote_all.php?dopost=make&step=2&sta={$sta}&totalnum=$totalnum");
                                exit;
                            }
                        } else {
                            if ($ftp->upload($localfile, $remotefile)) {
                                $sta++;
                                ShowMsg("成功同步文件$remotefile,进入下一个任务", "makeremote_all.php?dopost=make&step=2&sta={$sta}&totalnum=$totalnum");
                                exit;
                            }
                        }
                    }
                }
            } else {
                //否则成功更新完毕
                foreach ($remotefile as $key => $val) {
                    if (in_array($val['filedir'], array_values($upremote))) {
                        $remotefile[$key]['state'] = 1;
                    }
                }
                updateConfig($remotefile);
                @unlink(DEDEDATA . '/cache/filelist.inc.php');
                echo '全部同步完毕!';
                exit;
            }
        } else {
            exit('Error:None remote cache file exist!');
        }
        exit;
    }
}
include DedeInclude('templets/makeremote_all.htm');
